<?php

include_once '../Interfaces/XMLInterface.php';
include_once '../AtacCommunicator/ACBusWaitingTimes.php';
include_once '../InfoManager/InfoManager.php';
include_once '../Exceptions/WrongParametersException.php';
include_once '../Utility/DebugLogs.php';

class BusAtStop implements XMLInterface {
	
	//Nome del tag per la sintesi XML dell'oggetto. Una volta impostato, determina automaticam
	//la controparte: elementEnd
	private $elementStart;
	private $elementEnd;
	
	//La linea di cui fa parte l'autobus
	private $line;
	//La fermata di riferimento per cui � stato identificato l'autobus
	private $referenceBusStop;
	//Il numero di fermate che mancano per arrivare alla fermata di riferimento
	private $stopsLeft;
	//Il tempo stimato da atac per arrivare alla fermata di riferimento
	private $timeLeft;
	//Il percorso che l'autobus sta seguendo in questo momento
	private $currentPath;
	//L'id assegnato da atac per quel percorso
	private $currentPathID;
	//Questo orario sar� impostato soltanto se l'autobus � segnalato come 
	//in partenza dal capolinea ad una certa ora
	private $departureTime;
	
	
	/**
	 * Costruttori per gli oggetti di tipo BusAtStop
	 * @param BusLine $line
	 * @param BusStop $referenceBusStop
	 * @param int $stopsLeft
	 * @param float $timeLeft
	 * @param String $currentPathID, se non specificato viene assegnato null
	 * @return BusAtStop object
	 */
	function __construct($line, $referenceBusStop, $stopsLeft, $timeLeft, $currentPathID=null, $departureTime=null) {
		if (!$line instanceof BusLine)
		throw new WrongParametersException("Class: BusAtStop. Method: Constructor. \$line parameter
		must be of \$BusLine type"); 
		
		if (!$referenceBusStop instanceof BusStop)
		throw new WrongParametersException("Class: BusAtStop. Method: Constructor. \$referenceBusStop parameter
		must be of \$BusStop type");
		
		
		$this->referenceBusStop = $referenceBusStop;
		$this->line = $line;
		$this->stopsLeft = $stopsLeft;
		$this->timeLeft = $timeLeft;
		$this->departureTime = $departureTime;
		$this->currentPathID = $currentPathID;

		$this->elementStart = "<BUSATSTOP>";
		$this->elementEnd = "</BUSATSTOP>";
		
		
	}
	
	
	private function retrieveCurrentPath() {
		
		$infoManager = new InfoManager();

		$this->currentPath = $infoManager->getCachedPath($this->currentPathID);
		//echo "<br>path:".$this->currentPath."<br>";
		
		
	}
	
	
	/**
	 * Rende l'id del percorso che sta seguendo l'autobus. Tale id � un codice assegnato
	 * da atac. Pu� essere utilizzato per le interrogazioni su AtacCommunicator
	 * @return String la stringa contenente l'id del percorso
	 */
	function getCurrentPathID() {
		return $this->currentPathID;
	}
	
	/**
	 * Rende la lista delle fermate previste per il percorso che sta seguendo l'autobus.
	 * (Il percorso � identificato da currentPathID)
	 * @return Array una Array con dentro oggetti di tipo BusStop
	 */
	function getCurrentPath() {
		
	if (($this->currentPathID!=null) && ($this->currentPath==null))
	{
			$this->retrieveCurrentPath();
	}
		
		return $this->currentPath;
	}
	
	/**
	 * Rende la linea di riferimento dell'autobus.
	 * @return BusLine un oggetto di tipo BusLine
	 */
	function getLine() {
		return $this->line;
	}
	
	/**
	 * Rende il tempo stimato da atac per l'arrivo dell'autobus alla fermata
	 * referenceBusStop
	 * @return float il tempo residuo stimato per l'arrivo
	 */
	function getTimeLeft() {
		return $this->timeLeft;
	}
	
	function setTimeLeft($minutesLeft) {
		
		$this->timeLeft = $minutesLeft;
		
	}
	
	
	/**
	 * Rende il numero di fermate che mancano per l'arrivo alla fermata referenceBusStop
	 * @return int il numero di fermate che mancano all'arrivo
	 */
	function getStopsLeft() {
		return $this->stopsLeft;
	}
	
	function setStopsLeft($nStopsLeft) {
		
		$this->stopsLeft = $nStopsLeft;
		
	}
	
	
	/**
	 * Rende la fermata di riferimento per cui � stato istanziato il bus e a cui fanno
	 * riferimento le informazioni dell'oggetto
	 * @return BusStop la fermata di riferimento per l'autobus
	 */
	function getReferenceBusStop() {
		return $this->referenceBusStop;
	}
	
	
	
	/**
	 * (non-PHPdoc)
	 * @see src/Interfaces/XMLInterface#toXML($mode)
	 */
	function toXML($mode) {
		$logfile = fopen($_SERVER['DOCUMENT_ROOT'].FILE_LOG,'a');
				
		logthis("PROVA");
		if (($this->currentPathID!=null) && ($this->currentPath==null))
		{
			$this->retrieveCurrentPath();
			
		}

		$xml = "";
		//compact mode: qui dentro non posso richiamare altri metodi toXML
		if ($mode==COMPACT_MODE) {
			$xml = "\n<LINENUMBER>".$this->line->getLineNumber()."</LINENUMBER>\n";
			$xml = $xml."<TIMELEFT>".$this->timeLeft."</TIMELEFT>\n";
			$xml = $xml."<STOPSLEFT>".$this->stopsLeft."</STOPSLEFT>\n";
			if ($this->departureTime!=null)
				$xml = $xml."<DEPARTURETIME>".$this->departureTime."</DEPARTURETIME>\n"; 
			$xml = $xml."<PATHID>".$this->currentPathID."</PATHID>\n";
			
			//echo "Linenumber:".$this->line->getLineNumber();
			//echo "PathID:".$this->currentPathID;
			
			
			if ($this->currentPath != null)
			{
				$xml = $xml."<START>".$this->currentPath->getStartPoint()->getStopName()."</START>\n";
				$xml = $xml."<END>".$this->currentPath->getFinalDestination()->getStopName()."</END>\n";
			}
		}
		
		//extended mode qui dentro posso chiamare solo metodi toXML in modalita compact
		if ($mode==EXTENDED_MODE) {
			$xml = "\n<LINENUMBER>".$this->line->getLineNumber()."</LINENUMBER>\n";
			$xml = $xml."<TIMELEFT>".$this->timeLeft."</TIMELEFT>\n";
			$xml = $xml."<STOPSLEFT>".$this->stopsLeft."</STOPSLEFT>\n";
			if ($this->departureTime!=null)
				$xml = $xml."<DEPARTURETIME>".$this->departureTime."</DEPARTURETIME>\n";
			$xml = $xml."<PATHID>".$this->currentPathID."</PATHID>\n";
			if ($this->currentPath != null)
			{	
				$xml = $xml."<START>".$this->currentPath->getStartPoint()->getStopName()."</START>\n";
				$xml = $xml."<END>".$this->currentPath->getFinalDestination()->getStopName()."</END>\n";
			}
				
			if ($this->currentPath!=null)
			{
				
				
				$xml.=$this->currentPath->toXML(COMPACT_MODE);
				/*
				foreach ($this->currentPath->getStops() as $busStop)
				{	
					$xml.=$busStop->toXML(COMPACT_MODE);
				}
				*/
			}
			
		}
		
		
		$xml = "\n".$this->elementStart."\n".$xml."\n".$this->elementEnd."\n"; 
		return $xml;
		
		
	}
	
	/**
	 * (non-PHPdoc)
	 * @see src/Interfaces/XMLInterface#getElementStartTag()
	 */
	function getElementStartTag() {
		return $this->elementStart;
	}
	
	/**
	 * (non-PHPdoc)
	 * @see src/Interfaces/XMLInterface#getElementEndTag()
	 */
	function getElementEndTag() {
		return $this->elementEnd;
	}
	
	
	
}
?>
